func canPartition(nums []int) bool {
    /*
        将该问题转化为背包问题，物品的重量与价值相等
        1. dp 数组的定义
            dp[i]表示容量为i的背包可以装的最大重量，本题中将背包的上限取为总和的一半，数组的元素认为是物品

        2. 通项公式，采用覆盖式写法
            dp[i] = dp[i-weight[i]] + value[i] 

        3. dp数组初始化
            dp[0] = 0
            并且 所有的重量都大于0，所以数组内都初始化为0即可

        4. 确定遍历顺序
            先遍历背包容量后遍历物品，并且物品从大往后遍历
            
        5. 推到dp数组
    */
    var sum int
    for _, v := range nums{
        sum += v
    }
    if sum % 2 == 1 {
        return false
    }
    packageSize := sum/2
    dp := make([]int, packageSize+1)
    for i:=0; i<len(nums); i++ {
        for j:=packageSize; j>=1; j-- {
            if j >= nums[i] {
                dp[j] = max(dp[j], dp[j-nums[i]] + nums[i])
            }
        }
    }
    if dp[packageSize] == packageSize {
        return true
    }
    return false
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}
